package com.xinchen.ssh.demo.core.dao;

import com.xinchen.ssh.demo.core.entity.page.Page;
import com.xinchen.ssh.demo.core.entity.page.PageInfo;

import javax.sql.DataSource;
import java.util.List;

/**
 * Description：
 *
 * @author Xin Chen
 * @version 1.0
 * @date 2016/12/15 12:35
 * @see 2016/12/15 12:35 Created
 ****************************************/
public interface JdbcEntityManager extends EntityManager {

    /**
     * 设置数据源
     * @param dataSource dataSource
     */
    void setMyDataSource(DataSource dataSource);

    /**
     * 可直接运行的sql语句, 该方法有风险，客户端采用sql注入攻击时，会对系统有危害， 建议仅针对存储过程使用
     *
     * @param sql sql语句
     */
    void executeSQL(String sql);

    /**
     * 执行sql 注意：这里的sql不支持 命名参数，只能用 ? 代替
     * @param sql sql语句
     * @param args sql参数
     * @param types sql参数类型，详细参见java.sql.Types
     * @return int 执行结果
     */
    int executeSQL(String sql, Object[] args, int[] types);

    /**
     * 执行指定的sql并返回更新的记录数。
     * @param sql SQL语句
     * @param args 参数中的值
     * @return int 更新的记录数
     */
    int update(String sql, Object[] args);

    /**
     * 批量更新
     * @param sql sql语句
     * @return int[]  执行结果
     */
    int[] batchUpdate(String[] sql);

    /**
     * 执行指定的sql,并返回指定实体类型的集合，主要用于多表关联，左右连接查询， 指定的实现类型必须声明一个不带参数的构造方法。 例如，如下调用方式
     * this.getEntityManager().find(
     * "select r.url as url,r.id as id,rr.role_id as roleId" +
     * "from abf_resource r left join abf_role_resource rr on r.id=rr.resource_id"
     * , ResourceRoleVo.class); ResourceRoleVo类必须声明一个不带参数的构造方法
     *
     * @param sql SQL语句
     * @param entityClass 返回的实体类型
     * @return List 查询结果
     */
    List find(String sql, Class<?> entityClass);

    /**
     * 分页查询结果集。
     *
     * @param queryString 完整的HQL语句
     * @param entityClass 返回的实体类型
     * @param pageInfo 页面对象（CurrentPageNum 当前页，从零开始；RowsOfPage 每页条数）
     * @return Page 包括结果集 list，与pageInfo对象
     */
    Page find(String queryString, Class<?> entityClass, PageInfo pageInfo);

    /**
     * 分页查询结果集。
     *
     * @param queryString 完整的HQL语句
     * @param entityClass 返回的实体类型
     * @param pageInfo 页面对象（CurrentPageNum 当前页，从零开始；RowsOfPage 每页条数）
     * @return Page 包括结果集 list，与pageInfo对象
     */
    Page findForPage(String queryString, Class<?> entityClass, PageInfo pageInfo);

    /**
     * 执行指定的sql, sql中可以用?参数 同样，指定的实现类型必须声明一个不带参数的构造方法。
     *
     * @param sql SQL语句
     * @param params  SQL中参数
     * @param entityClass 返回的实体类型
     * @return List 查询结果
     */
    List find(String sql, Object[] params, Class<?> entityClass);

    /**
     * 执行指定的sql, 并可以指定返回结果的开始记录和大小 同样，指定的实现类型必须声明一个不带参数的构造方法。
     *
     * @param queryString SQL语句
     * @param entityClass 返回的实体类型
     * @param start 返回的结果开始记录
     * @param size 返回的结果集大小
     * @return List 查询结果
     */
    List find(String queryString, Class<?> entityClass, int start, int size);

    /**
     * 执行指定的sql, 并可以指定返回结果的开始记录和大小 同样，指定的实现类型必须声明一个不带参数的构造方法。
     *
     * @param queryString SQL语句
     * @param entityClass 返回的实体类型
     * @param start 返回的结果开始记录
     * @param size 返回的结果集大小
     * @return List 查询结果
     */
    List findForPage(String queryString, Class<?> entityClass, int start, int size);

    /**
     * 获取执行存储方法对象
     *
     * @param storedProcedureName 存储过程名称
     * @return StoredProcedures 存储过程
     */
    StoredProcedures getStoredProcedure(String storedProcedureName);

}
